/**
 * 该文件模拟底层硬件驱动，这里的很多函数都会返回一个整数，表示操作结果（0表示成功，其他的依据各个函数自己定义）
 * 注意：这里只涉及底层硬件的操作，不会操作页面的任何元素
 * 该部分主要以一个单例模式实现，定义一个类Hardware
 */

/**
 * 一些参数的默认值
 */
var DEFAULT_UPPER_ROLL_TEMP = 15;
var DEFAULT_DOWN_ROLL_TEMP = 15;
var DEFAULT_PACK_COUNT = 15;
var DEFAULT_PACK_VOLUME = 15;
 
/**
 * 单例模式的实现
 */
var Hardware = (function () {
    var instantiated; // 类的实例对象

	/*********************包装部分需要的参数***************************/
    var packOn; // 表示当前包装系统的开关状态

    // 四个设置参数
    var upperRollTemp; // 上辊温度
    var downRollTemp; // 下辊温度
    var packCount; // 要包装的袋数
    var packVolume; // 每袋的容量

    var packedCount; // 已包装完成的袋数
	
	var autoMode;  // 自动模式是否开启
	
	var upWarmMode;  // 上辊热合状态，0-未启动，1-加热中，-1-降温中，2-已达到
	var downWarmMode;  // 下辊热合状态，同上
	/*********************包装部分需要的参数 end***************************/

    /**
     * 初始化函数
     */
    function init() {

        // 包装部分成员变量初始化
        packOn = false; // 初始状态时包装功能为关闭状态
		
		upperRollTemp = DEFAULT_UPPER_ROLL_TEMP;
		downRollTemp = DEFAULT_DOWN_ROLL_TEMP;
		packCount = DEFAULT_PACK_COUNT;
		packVolume = DEFAULT_PACK_VOLUME;
		
		packedCount = 0;
		
		autoMode = false;
		
		upWarmMode = 0;
		downWarmMode = 0;
		// 包装部分成员变量初始化 end

        console.log("硬件设备初始化。。。");

        /*这里定义单例代码*/
        return {
            /**
             * 打开和关闭包装功能
			 * 返回值：0表示操作成功
             */
            startPack: function () {
                if (packOn) {
                    console.log("关闭包装");
                    packOn = false;
                } else {
                    console.log("打开包装");
                    packOn = true;
                }
				return 0;
            },

            /**
             * 设置四个参数，假如为-1则表示该参数不变，仍为原来的值即可
             * 返回值：0表示操作成功
             */
            configPack: function (urt, drt, pc, pv) {
				console.log("设置包装的四个参数："+urt+", "+drt+", "+pc+", "+pv)
                // TODO 此处应该有一些值的合法性的校验等
                if (urt >= 0) {
                    upperRollTemp = urt;
                }
                if (drt >= 0) {
                    downRollTemp = drt;
                }
                if (pc >= 0) {
                    packCount = pc;
                }
                if (pv >= 0) {
                    packVolume = pv;
                }

                return 0;
            },

            /**
             * 将已包装数量清零
             */
            resetPackedCount: function () {
				console.log("已包装数清零。。。")
                packedCount = 0
            },
			
			/**
			 * 包装一袋，即按下注入键之后的操作
			 * 返回值：0表示操作成功，1表示设置的包装数量已经完成，不能再包装了
			 */
			onePack: function(){
				if(packedCount>=packCount){
					console.log("设置的包装数量已完成，不能再包装了。。。");
					return 1;
				}
				console.log("包装一袋。。。");
				packedCount++;
				return 0;
			},
			
			/**
			 * 自动包装模式的开启和关闭
			 * 返回值：0表示操作成功，1表示设置的包装数量已经完成，不能再包装了
			 */
			autoPack: function(){
				// TODO 此处应该增加一些合法性的判断，另外此处需要注意如果正在自动包装中，那么已包装成功的结果需要加一
				if(autoMode){
					console.log("关闭自动模式。。。");
					autoMode = false;
				}else{
					if(packedCount>=packCount){
						console.log("设置的包装数量已经完成，不能再包装了。请重新包装或者增加计划包装数量。。。");
						return 1;
					}
					console.log("开启自动模式。。。");
					autoMode = true;
				}
				
				return 0;
			},
			
			/**
			 * 热合开启
			 * 返回值：0表示操作成功
			 */
			warmPack: function(){
				if(warmOn){
					console.log("关闭热合");
					warmOn = false;
				}else{
					console.log("开启热合");
					warmOn = true;
				}
				
				return 0;
			},
			
			/**
			 * 返回是否开启热合
			 */
			isWarmOn: function () {
				return warmOn;
			},
			
			/**
             * 供外部程序判断包装部分当前的状态
             */
            isPackOn: function () {
                return packOn;
            },
			
			/**
			 * 判断自动模式是否开启
			 * 返回值：true表示开启，false表示关闭
			 */
			isAutoOn: function(){
				return autoMode;
			},
			
			/**
			 * 获取上辊温度
			 */
			getUpperRollTemp: function(){
				return upperRollTemp;
			},
			
			/**
			 * 获取下辊温度
			 */
			getDownRollTemp: function(){
				return downRollTemp;
			},
			
			/**
			 * 获取计划包装数量
			 */
			getPackCount: function(){
				return packCount;
			},
			
			/**
			 * 获取包装容量
			 */
			getPackVolume: function(){
				return packVolume;
			},
			
			/**
			 * 获取已包装的数量
			 */
			getPackedCount: function(){
				return packedCount;
			}
        };
    }

    return {
        getInstance: function () {
            if (!instantiated) {
                instantiated = init();
            }
            return instantiated;
        }
    };
})();
